package main.java;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class DataContainer<T> {
    // 个性化要求：添加学号常量（绑定学号202411671214）
    public static final String STUDENT_ID = "202411671214";

    private List<T> dataList;

    // 无参构造：初始化空ArrayList
    public DataContainer() {
        this.dataList = new ArrayList<>();
    }

    // 带参构造：深拷贝传入列表（避免外部修改影响内部数据）
    public DataContainer(List<T> initialData) {
        if (initialData == null) {
            this.dataList = new ArrayList<>();
        } else {
            // 深拷贝：创建新列表，逐个添加元素（引用类型浅拷贝，若需完全深拷贝需元素支持克隆）
            this.dataList = new ArrayList<>(initialData);
        }
    }

    // 添加单个元素
    public void add(T element) {
        dataList.add(element);
    }

    // 添加另一个容器的所有元素（支持子类型容器，如DataContainer<String> → DataContainer<Object>）
    public void addAll(DataContainer<? extends T> otherContainer) {
        if (otherContainer == null) {
            throw new IllegalArgumentException("otherContainer cannot be null");
        }
        // 遍历otherContainer的元素，添加到当前容器
        for (int i = 0; i < otherContainer.size(); i++) {
            this.dataList.add(otherContainer.get(i));
        }
    }

    // 获取指定索引元素（含边界检查）
    public T get(int index) {
        // 边界检查：索引<0或>=size时抛出异常
        if (index < 0 || index >= dataList.size()) {
            throw new IndexOutOfBoundsException(
                    "Index: " + index + ", Size: " + dataList.size()
            );
        }
        return dataList.get(index);
    }

    // 过滤元素：返回符合条件的新容器，不修改原容器
    public DataContainer<T> filter(Predicate<? super T> predicate) {
        if (predicate == null) {
            throw new IllegalArgumentException("predicate cannot be null");
        }
        DataContainer<T> filteredContainer = new DataContainer<>();
        for (T element : dataList) {
            if (predicate.test(element)) {
                filteredContainer.add(element);
            }
        }
        return filteredContainer;
    }

    // 返回内部列表的副本（防止外部修改）
    public List<T> toList() {
        return new ArrayList<>(dataList); // 副本：外部修改不影响内部dataList
    }

    // 获取容器元素个数
    public int size() {
        return dataList.size();
    }

    // 清空容器所有元素
    public void clear() {
        dataList.clear();
    }
}